package com.xuehu.cloud.loadBalancer;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author guoweia@cslc.com.cn
 * @createTime 2020/12/1 9:09
 * @description自定义ribbon负载均衡策略,默认是轮询，注意包名，需在@ComponentScan所扫描的包名内
 */
@Configuration
public class RibbonRule {
    /**
     * IRule 含有七种规则算法，分别是
     * RoundRobinRule (轮询)
     * RandomRule (随机)
     * RetryRule (先按轮询策略获取服务，如果获取服务失败则在指定时间内重试，获取可用服务)
     * WeightResponseTimeRule (对轮询的扩展，响应速度越快的实例选择比重权越大，越容易被选择)
     * BestAvailableRule (会先过滤由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务)
     * AvailabilityFilteringRule (会优先过滤故障实例，再选择并发较小的实例)
     * ZoneAvodanceRule (默认规则，符合判断server所在区域的性能和server的可用性选择服务器)
     * @return
     */
    @Bean
    public IRule customRule() {
        //return new RetryRule();
        return new RandomRule();
        //return new ZoneAvoidanceRule();
    }
}
